spring 您所在的位置:网站首页 spring boot 异步调用偶尔不生效 spring

spring

2024-06-16 22:10| 来源: 网络整理| 查看: 265

文末解释原因

注:@Transactional不生效的原因也是

 

不生效的代码: @Component public class AsycnTest { public void test(){ testAsync(); } @Async public void testAsync(){ } } 解决方案:

方案一、将方法抽离出去,再调用

1、主类

@Component public class AsycnTest { @Autowired private Test test; public void test(){ test.testAsync(); } }

2、抽离出去的方法类

@Component public class Test { @Async public void testAsync(){ } }

方案二、注入当前类,在用注入的类调用该方法。一定记住加@Lazy注解,防止循环注入

@Component public class AsycnTest { @Lazy @Autowired private AsycnTest asycnTest; public void test(){ asycnTest.testAsync(); } @Async public void testAsync(){ } }

不能调用的原因:

1、先看spring怎么实现的:spring 在扫描bean的时候会扫描该类的方法上是否包含 @Async 注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类 proxy),代理类是继承原来那个bean的,并且重写了父类中被 @Async 注解的方法(如果该注解是加在了类上,则会重写该类的所有方法),并利用AOP切面为这些方法加上异步逻辑

 

2、原因:当这个有注解的方法被调用的时候,实际上调用的是代理类中重写过的方法。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么就不会调用该代理类了,而是直接通过当前对象去调,所以也就不生效了,所以我们看到的现象就是该异步方法没有生效。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有